/**
 * 系统信息帮助类
 * 用于获取系统信息并提供兼容性封装
 */

// 系统信息缓存
let systemInfoCache = null;

// 系统信息助手类
class SystemHelper {
  /**
   * 获取系统信息（组合版本）
   * 使用推荐的API组合替代被弃用的getSystemInfo
   * @param {Object} options - 配置选项
   * @param {Function} options.success - 成功回调函数
   * @param {Function} options.fail - 失败回调函数
   * @param {Function} options.complete - 完成回调函数
   */
  static getSystemInfo(options = {}) {
    // 如果有缓存且不强制刷新，直接返回缓存
    if (systemInfoCache && !options.forceRefresh) {
      if (typeof options.success === 'function') {
        options.success(systemInfoCache);
      }
      if (typeof options.complete === 'function') {
        options.complete(systemInfoCache);
      }
      return;
    }
    
    try {
      // 创建系统信息对象
      const systemInfo = {};
      
      // 获取设备设置信息
      try {
        const systemSetting = wx.getSystemSetting();
        Object.assign(systemInfo, systemSetting);
      } catch (e) {
        console.warn('获取系统设置信息失败', e);
      }
      
      // 获取应用授权信息
      try {
        const appAuthorizeSetting = wx.getAppAuthorizeSetting();
        Object.assign(systemInfo, { appAuthorizeSetting });
      } catch (e) {
        console.warn('获取应用授权信息失败', e);
      }
      
      // 获取设备信息
      try {
        const deviceInfo = wx.getDeviceInfo();
        Object.assign(systemInfo, deviceInfo);
      } catch (e) {
        console.warn('获取设备信息失败', e);
      }
      
      // 获取窗口信息
      try {
        const windowInfo = wx.getWindowInfo();
        Object.assign(systemInfo, windowInfo);
      } catch (e) {
        console.warn('获取窗口信息失败', e);
      }
      
      // 获取应用基础信息
      try {
        const appBaseInfo = wx.getAppBaseInfo();
        Object.assign(systemInfo, appBaseInfo);
      } catch (e) {
        console.warn('获取应用基础信息失败', e);
      }
      
      // 更新缓存
      systemInfoCache = systemInfo;
      
      // 调用成功回调
      if (typeof options.success === 'function') {
        options.success(systemInfo);
      }
      
      // 调用完成回调
      if (typeof options.complete === 'function') {
        options.complete(systemInfo);
      }
    } catch (error) {
      console.error('获取系统信息失败，尝试降级处理', error);
      
      // 降级处理：仍然使用getSystemInfo
      wx.getSystemInfo({
        success: (res) => {
          // 更新缓存
          systemInfoCache = res;
          if (typeof options.success === 'function') {
            options.success(res);
          }
        },
        fail: (err) => {
          if (typeof options.fail === 'function') {
            options.fail(err);
          }
        },
        complete: (res) => {
          if (typeof options.complete === 'function') {
            options.complete(res);
          }
        }
      });
    }
  }
  
  /**
   * 获取系统信息（Promise版本）
   * @param {Boolean} forceRefresh - 是否强制刷新
   * @returns {Promise<Object>} 系统信息对象
   */
  static getSystemInfoAsync(forceRefresh = false) {
    return new Promise((resolve, reject) => {
      this.getSystemInfo({
        forceRefresh,
        success: resolve,
        fail: reject
      });
    });
  }
  
  /**
   * 同步获取系统信息（使用缓存）
   * 注意：首次调用会返回null，应该先调用getSystemInfo或getSystemInfoAsync
   * @returns {Object|null} 系统信息对象或null
   */
  static getSystemInfoSync() {
    console.warn('wx.getSystemInfoSync已弃用，请使用SystemHelper.getSystemInfoAsync');
    
    // 返回缓存，不调用wx.getSystemInfoSync
    return systemInfoCache || null;
  }
  
  /**
   * 获取窗口信息
   * @returns {Promise<Object>} 窗口信息
   */
  static getWindowInfo() {
    return new Promise((resolve, reject) => {
      try {
        const windowInfo = wx.getWindowInfo();
        resolve(windowInfo);
      } catch (error) {
        reject(error);
      }
    });
  }
  
  /**
   * 获取设备信息
   * @returns {Promise<Object>} 设备信息
   */
  static getDeviceInfo() {
    return new Promise((resolve, reject) => {
      try {
        const deviceInfo = wx.getDeviceInfo();
        resolve(deviceInfo);
      } catch (error) {
        reject(error);
      }
    });
  }
  
  /**
   * 获取应用基础信息
   * @returns {Promise<Object>} 应用基础信息
   */
  static getAppBaseInfo() {
    return new Promise((resolve, reject) => {
      try {
        const appBaseInfo = wx.getAppBaseInfo();
        resolve(appBaseInfo);
      } catch (error) {
        reject(error);
      }
    });
  }
  
  /**
   * 判断是否为iOS设备
   * @returns {Boolean} 是否为iOS设备
   */
  static isIOS() {
    return systemInfoCache && systemInfoCache.platform === 'ios';
  }
  
  /**
   * 判断是否为Android设备
   * @returns {Boolean} 是否为Android设备
   */
  static isAndroid() {
    return systemInfoCache && systemInfoCache.platform === 'android';
  }
  
  /**
   * 判断是否为开发者工具
   * @returns {Boolean} 是否为开发者工具
   */
  static isDevTools() {
    return systemInfoCache && systemInfoCache.platform === 'devtools';
  }
  
  /**
   * 获取状态栏高度
   * @returns {Number} 状态栏高度
   */
  static getStatusBarHeight() {
    return systemInfoCache ? (systemInfoCache.statusBarHeight || 20) : 20;
  }
  
  /**
   * 获取屏幕宽度
   * @returns {Number} 屏幕宽度
   */
  static getScreenWidth() {
    return systemInfoCache ? systemInfoCache.screenWidth : 375;
  }
  
  /**
   * 获取屏幕高度
   * @returns {Number} 屏幕高度
   */
  static getScreenHeight() {
    return systemInfoCache ? systemInfoCache.screenHeight : 667;
  }
  
  /**
   * 获取设备像素比
   * @returns {Number} 设备像素比
   */
  static getPixelRatio() {
    return systemInfoCache ? systemInfoCache.pixelRatio : 2;
  }
}

// 修改初始化方式，使用异步Promise方式
// 初始化缓存
(async () => {
  try {
    // 异步初始化
    await SystemHelper.getSystemInfoAsync(true);
  } catch (error) {
    console.error('SystemHelper初始化失败', error);
  }
})();

module.exports = SystemHelper; 